<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        class Set {
            constructor() {
                this.items = {}//对象
            }

            //add方法 将元素添加到集合中
            add(value) {
                //1.先判断当前集合中是否已经包含了该元素
                if (this.has(value)) return false;
                //2.没有包含进行添加
                this.items[value] = value;
                return true;
            }

            //has方法 判断是否存在属性名
            has(value) {
                return this.items.hasOwnProperty(value);
            }

            //remove方法 
            remove(value) {
                //判断该集合中是否包含该元素
                if (!this.has(value)) return false;
                //进行删除
                delete this.items[value];
                return true;
            }

            //clear 清空对象的方法
            clear() {
                this.items = {};
            }

            //size 查询长度 Object.keys的意思是返回有的属性把他们并放在数组里面
            size() {
                return Object.keys(this.items).length;
            }

            //values  获取集合中所有的值
            values() {
                return Object.keys(this.items)
            }

            //集合间的操作
            //并集
            union(otherSet) {
                // this:当前的对象集合A
                // otherSet: 集合对象B
                // 1.创建新的集合
                var unionSet = new Set();   //创建对象unionSet
                //2.将A集合中的所有的元素添加的新集合中
                var values = this.values();
                for (var i = 0; i < this.size(); i++) {
                    unionSet.add(values[i]); //把当前A集合的属性全部放到新集合中
                }
                //3.取出b集合中的元素判断是否加入到新集合
                values = otherSet.values();//将b集合的 赋值给values
                for (var i = 0; i < values.length; i++) {
                    unionSet.add(values[i]); //将B集合添加到输出集合中，add自带判断，可以直接用add添加
                }

                return unionSet;
            }
            //交集
            intersection(otherSet) {
                //this 集合对象A 
                // otherSet: 集合对象B 
                //1.先创建一个新的空集合
                var intersectionSet = new Set();
                //2.从A中取出所有的集合 用来与B集合做判断是否已经存在
                var values = this.values();
                for (var i = 0; i < values.length; i++) {
                    var item = values[i];
                    if (otherSet.has(item)) {
                        intersectionSet.add(item);
                    }
                }

                return intersectionSet;
            }
            //差集合
            difference(otherSet) {
                var difference = new Set();//创建差集合difference
                var values = this.values();
                for (var i = 0; i < values.length; i++) {
                    var item = values[i]
                    if (!otherSet.has(item)) {
                        difference.add(item)
                    }
                }
                return difference;
            }
            //子集
            subset(otherSet) {
                //判断A是否是otherSet的子集
                var values = this.values();
                for(var i = 0; i < values.length; i++) {
                    if(!otherSet.has(values[i])) {
                        return false
                    }
                }
                return true;
            }


            //自己默写
            //交集
            interSection(otherSet) {
                // let a = otherSet.values();
                let interSet = new Set();
                let b = this.values();
                for(let i = 0; i < b.length; i++) {
                    if(otherSet.has(b[i])) {
                        interSet.add(b[i])
                    }
                }
                return interSet;
            }
        }

        // console.log(shuaige);
        // console.log(Object.keys(shuaige));
        // const set = new Set();
        // set.add("name1")
        // set.add("name2")
        // set.add("name3")
        // console.log(set.size());
        // set.remove("name1")
        // set.clear();
        // console.log(set);

        //并集
        // const set1 = new Set();
        // const set2 = new Set();
        // set1.add("aaa");
        // set1.add("bbb");
        // set2.add("aaa");
        // console.log(set1.values());
        // const unionSet = set1.union(set2);
        // console.log(unionSet);
        // console.log(set1.size());

        //交集
        // const set1 = new Set();
        // const set2 = new Set();
        // set1.add("a");
        // set1.add("b");
        // set2.add("a");
        // const union = set1.intersection(set2);
        // console.log(union);

        //差集
        // const set1 = new Set();
        // const set2 = new Set();
        // set1.add("a");
        // set1.add("b");
        // set2.add("a");
        // const union = set1.difference(set2);
        // console.log(union);

        //判断是否是子集
        // const set1 = new Set();
        // const set2 = new Set();
        // set1.add("a");
        // set1.add("b");
        // set1.add("c");
        // set2.add("a");
        // set2.add("b");
        // set2.add("c");
        // const union = set1.subset(set2);
        // console.log(union);

    </script>
</body>

</html>